﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;

namespace ESpace
{
    public class EStream
    {

        String FName;
        FileStream Sv;
        BinaryWriter w;
        BinaryReader r;

        //конструктор
        public EStream(String FN)
        {
            FName = FN;
        }
        //---------------------------------------------------------------------------
        #region OpenClose

        public void OpenLoad()
        {
            Sv = new FileStream(FName, FileMode.Open, FileAccess.Read);
            r = new BinaryReader(Sv);
        }
        public void OpenSave()
        {
            Sv = new FileStream(FName, FileMode.Create);
            w = new BinaryWriter(Sv);
        }
        public void CloseLoad()
        {
            r.Close();
            Sv.Close();
        }
        public void CloseSave()
        {
            w.Close();
            Sv.Close();
        }

        #endregion OpenClose
        //---------------------------------------------------------------------------
        public String LoadStr()
        {
            String str = "";
            try
            {
                int sz = r.ReadInt32();
                for (int i = 0; i < sz; i++)
                    str += r.ReadChar();
            }
            catch { };
            return str;
        }
        public void SaveStr(String s)
        {
            int sz = s.Length;
            w.Write(sz);
            for (int i = 0; i < sz; i++)
            {
                w.Write((char)s[i]);
            }
        }
        //---------------------------------------------------------------------------
        public byte[] LoadBuf()
        {
            int sz = LoadInt();
            return r.ReadBytes(sz);
        }
        public void SaveBuf(byte[] buf)
        {
            SaveInt(buf.Length);
            w.Write(buf);
        }
        //---------------------------------------------------------------------------
        public Bitmap LoadBmp()
        {
            int w = LoadInt();
            int h = LoadInt();
            byte[] buf = LoadBuf();

            Bitmap bmp = new Bitmap(w, h);
            
            // блокируем bmp
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            System.Drawing.Imaging.BitmapData bmpData =
                bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);

            // находим адрес на первую линию bmp
            IntPtr ptr = bmpData.Scan0;

            // копируем массив в bmp
            System.Runtime.InteropServices.Marshal.Copy(buf, 0, ptr, bmpData.Stride * bmp.Height);

            // разблокируем bmp.
            bmp.UnlockBits(bmpData);       
            
            return bmp;
        }
        public void SaveBmp(Bitmap bmp)
        {
            // сохраняем размеры bmp
            SaveInt(bmp.Width);
            SaveInt(bmp.Height);

            // блокируем bmp
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            System.Drawing.Imaging.BitmapData bmpData =
                bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);

            // находим адрес на первую линию bmp
            IntPtr ptr = bmpData.Scan0;

            // создаем массив байт
            int sz = bmpData.Stride * bmp.Height;
            byte[] rgbValues = new byte[sz];

            // копируем значения RGB в массив
            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, sz);

            // сохраняем массив
            SaveBuf(rgbValues);

            // разблокируем bmp.
            bmp.UnlockBits(bmpData);   
        }
        //---------------------------------------------------------------------------
        public DateTime LoadDate()
        {
            return new DateTime(r.ReadInt64());
        }
        public void SaveDate(DateTime dt)
        {
            w.Write(dt.Ticks);
        }
        //---------------------------------------------------------------------------
        public int LoadInt()
        {
            return r.ReadInt32();
        }
        public void SaveInt(int i)
        {
            w.Write(i);
        }
        //---------------------------------------------------------------------------
        public double LoadDouble()
        {
            return r.ReadDouble();
        }
        public void SaveDouble(double d)
        {
            w.Write(d);
        }
        //---------------------------------------------------------------------------
        public byte LoadByte()
        {
            return r.ReadByte();
        }
        public void SaveByte(byte b)
        {
            w.Write(b);
        }
        //---------------------------------------------------------------------------
        public bool LoadBool()
        {
            return r.ReadBoolean();
        }
        public void SaveBool(bool b)
        {
            w.Write(b);
        }
        //---------------------------------------------------------------------------


        public static void QuickCreateTextFile(String fName, String text)
        {
            /*if (File.Exists(fName)) File.Delete(fName);
            FileStream fs = new FileStream(fName, FileMode.Create);
            fs.Close();
            fs.Dispose();*/
            
            File.WriteAllText(fName, text, Encoding.Default);
        }

        public static String QuickReadTextFile(String fName)
        {
            return File.ReadAllText(fName, Encoding.Default);
        }

        public static String[] ReadTextFile(String fName)
        {
            return File.ReadAllLines(fName, Encoding.Default);
        }

        /// <summary>
        /// имя файла или папки по полному пути (str[0] - имя, str[1] - расширение, str[2] - путь к папке)
        /// </summary>
        public static String[] NameFromPath(String fPath)
        {
            String[] str = new String[3];

            for (int i = fPath.Length - 2; i >= 0; i--)
            {
                if (fPath[i] == '\\')
                {
                    String fName = fPath.Substring(i + 1, fPath.Length - i - 1);
                    // разбиваем на расширение и имя файла
                    for (int j = fName.Length - 1; j >= 0; j--)
                    {
                        if (fName[j] == '.')
                        {
                            if (j != (fName.Length - 1))
                            {
                                str[1] = fName.Substring(j + 1, fName.Length - j - 1);
                                str[0] = fName.Replace("." + str[1], "");
                            }
                            else
                            {
                                str[0] = fName;
                                str[1] = "";
                            }
                        }
                    }
                    // находим папку
                    str[2] = fPath.Replace("\\" + fName, "");
                }
            }

            return str;
        }
        

    }
}
  
